应用分发快速入门

您可以通过ACK One舰队的应用分发功能将舰队实例中的应用分发至多个关联集群中,无需依赖Git仓库,简化应用部署流程。本文介绍如何在舰队实例中创建应用并根据分发策略分发至多集群中。

前提条件

步骤一(可选):在舰队实例中创建命名空间

如果待分发的应用所在的命名空间在舰队中不存在,您需要先在舰队实例中创建命名空间,如已存在则跳过此步骤。

使用舰队实例的KubeConfig连接舰队实例,执行以下命令,创建示例命名空间demo。

kubectl create namespace demo

步骤二:在舰队实例中创建应用

此处应用支持ConfigMap、Deployment、Service等资源,本文以分发单独一个Nginx Deployment为例介绍。

  1. 使用以下内容,创建web-demo.yaml文件。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: demo
      name: web-demo
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: web-demo
      template:
        metadata:
          labels:
            app: web-demo
        spec:
          containers:
          - name: nginx
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0
            ports:
            - containerPort: 80
  2. 执行以下命令部署应用。

    kubectl apply -f web-demo.yaml

步骤三:在舰队实例中创建分发策略为多集群分发应用

您可以通过定义分发策略(PropagationPolicy)选择需要分发的应用以及对应的集群。创建分发策略后会将匹配到的应用分发到对应集群中。

本文示例:以复制(Duplicated)方式将Deployment weighted-deployment分发到Cluster1Cluster2中,两集群副本数一致,均为3个。

  1. 执行以下命令,获取舰队实例管理的子集群ID。

    kubectl get mcl

    预期输出:

    NAME                                HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED   AVAILABLE   AGE
    cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   true                                  True     True        3d23h
    cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   true                                  True     True        5d21h
  2. 使用以下内容,创建propagationpolicy.yaml文件。

    说明

    ClusterPropagationPolicy用于Cluster Scope资源的分发,PropagationPolicy用于Namespace Scope资源的分发。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: ClusterPropagationPolicy
    metadata:
      name: web-demo
    spec:
      - apiVersion: v1
        kind: Namespace
        name: demo
      placement:
        clusterAffinity:
          clusterNames:
          - ${cluster1-id} # 您的集群id
          - ${cluster2-id} # 您的集群id
        replicaScheduling:
          replicaSchedulingType: Duplicated
    ---
    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: web-demo
      namespace: demo
    spec:
      preserveResourcesOnDeletion: true     # 设置为true,删除舰队上资源时,子集群上资源会被保留。如需同时清理子集群资源,请设置为false。
      resourceSelectors:
      - apiVersion: apps/v1
        kind: Deployment
        name: web-demo
        namespace: demo
      placement:
        clusterAffinity:
          clusterNames:
          - ${cluster1-id} # 您的集群id
          - ${cluster2-id} # 您的集群id
        replicaScheduling:
          replicaSchedulingType: Duplicated

    主要参数说明如下,详细参数说明请参见分发策略

    参数

    说明

    参数值

    resourceSelectors

    选择一个或多个待分发的K8s资源。

    • apiVersion:指定待分发资源的apiVersion,必选。

    • kind:指定待分发资源的类型,必选。

    • name:指定待分发资源的名称。

    • namespace:指定待分发资源的命名空间。

      说明

      PropagationPolicy只可以选择其本身所在命名空间的资源。

    • labelSelector:通过标签选择资源。

    placement

    clusterAffinity:指定资源要分发的集群。

    通过clusterNames数组直接指明集群ID。更多其他选择方式请参见分发策略

    说明

    此处需填写集群ID,不是集群名称。

    replicaScheduling:指定有副本数资源的调度策略。例如Deployment、StatefulSet、Job。

    replicaSchedulingType值为Duplicated,表示会将每个资源都复制到集群中,即每个集群都会有spec.Replicas个副本数。更多说明请参见分发策略

  3. 执行以下命令,创建分发策略。

    kubectl apply -f propagationpolicy.yaml

步骤四(可选):在舰队实例中创建差异化策略

您可以通过定义差异化策略(OverridePolicy)选择需要差异化部署的集群以及资源。创建差异化策略后会将相应的资源进行定制化修改后再部署到选中的集群中。

本文示例:将部署到Cluster2的应用进行一些差异化修改,将replicas数修改为1,且将镜像的registry修改为阿里云的registry

  1. 使用以下内容,创建overridepolicy.yaml文件。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: OverridePolicy
    metadata:
      name: example
      namespace: demo
    spec:
      resourceSelectors:
        - apiVersion: apps/v1
          kind: Deployment
          name: web-demo
      overrideRules:
        - targetCluster:
            clusterNames:
              - ${cluster2-id}
          overriders:
            plaintext:
              - operator: replace
                path: /spec/replicas
                value: 1
            imageOverrider:
              - component: Registry
                operator: add
                value: {{Registry}}

    主要参数说明如下,详细参数说明请参见差异化策略

    参数

    说明

    参数值

    resourceSelector

    选择需要差异化修改的资源。

    • apiVersion:指定需要差异化修改资源的apiVersion,必选。

    • kind:指定需要差异化修改的资源类型,必选。

    • name:指定需要差异化修改的资源名称。

    • namespace:指定需要差异化修改的命名空间。

      说明

      PropagationPolicy只可以选择其本身所在命名空间的资源。

    • labelSelector:通过标签来选择资源。

    overrideRules

    通过一组覆盖规则修改应用模板。

    • plaintext:使用JSON Patch的方式修改模板。

    • imageOverrider:可以修改镜像的registryrepositoryversion

  2. 执行以下命令,创建差异化策略。

    kubectl apply -f overridepolicy.yaml

步骤五:查看多集群中应用的状态

您可以通过以下AMC命令查看应用的多集群分发状态,也可以直接去关联集群中查看应用的运行状态,以确认舰队应用分发成功。

执行以下命令,查看应用状态。

kubectl amc get deploy -ndemo -M

预期输出:

NAME       CLUSTER          READY   UP-TO-DATE   AVAILABLE   AGE    ADOPTION
web-demo   cxxxxxxxxxxxxx   3/3     3            3           3d4h   Y
web-demo   cxxxxxxxxxxxxx   3/3     3            3           3d4h   Y

预期输出表明,应用已经分发至指定的集群中。

步骤六:升级修改应用

  1. 使用如下内容修改web-demo.yaml,此处以增大replicas为例。您可以对应用资源做任意修改或升级。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: demo
      name: web-demo
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: web-demo
      template:
        metadata:
          labels:
            app: web-demo
        spec:
          containers:
          - name: nginx
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0
            ports:
            - containerPort: 80
  2. 执行以下命令,更新web-demo.yaml应用。

    kubectl apply -f web-demo.yaml
  3. 执行以下命令,查看应用状态。

    kubectl amc get deploy -ndemo -M

    预期输出:

    NAME       CLUSTER          READY   UP-TO-DATE   AVAILABLE   AGE    ADOPTION
    web-demo   cxxxxxxxxxxxxx   4/4     4            4           3d4h   Y
    web-demo   cxxxxxxxxxxxxx   4/4     4            4           3d4h   Y

步骤七:删除应用资源

对于Namespace资源,为防止误删除,舰队只会进行分发不会进行删除。对于其他资源,为防止误删除,默认情况下在删除舰队应用资源或删除分发策略时子集群的应用资源不会被删除。如果您需要清理子集群的应用资源,请按照以下步骤。

  1. 修改ClusterPropagationPolicypreserveResourcesOnDeletion字段为false,表明删除舰队实例的应用资源时会删除子集群的应用资源。

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: ClusterPropagationPolicy
    metadata:
      name: web-demo
    spec:
      preserveResourcesOnDeletion: false
      resourceSelectors:
      - apiVersion: apps/v1
        kind: Deployment
        name: web-demo
      - apiVersion: v1
        kind: Namespace
        name: demo
      placement:
        clusterAffinity:
          clusterNames:
          - ${cluster1-id} # 您的集群id
          - ${cluster2-id} # 您的集群id
        replicaScheduling:
          replicaSchedulingType: Duplicated
  2. 执行如下命令,更新分发策略。

    kubectl apply -f propagationpolicy.yaml
  3. 执行如下命令,删除应用资源。

    kubectl delete -f web-demo.yaml
  4. 执行如下命令,查看应用资源。

    kubectl amc get deploy -ndemo -M

    预期输出:

    cluster(cxxxxxxxxxxxxx): deployments.apps "web-demo" not found
    cluster(cxxxxxxxxxxxxx): deployments.apps "web-demo" not found

相关文档